package com.woniuxy.sales.service.impl;

import com.woniuxy.sales.common.RedisConst;
import com.woniuxy.sales.mapper.GoodsMapper;
import com.woniuxy.sales.model.entity.Goods;
import com.woniuxy.sales.model.vo.CartItemVo;
import com.woniuxy.sales.model.vo.CartVo;
import com.woniuxy.sales.service.CartService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Service;

import java.awt.print.Book;
import java.util.List;
import java.util.concurrent.TimeUnit;

@Service
public class CartServiceImpl implements CartService {

    @Autowired
    private RedisTemplate<String, CartVo> redisTemplate;

    @Autowired
    private GoodsMapper goodsMapper;
    @Override //获取用户的购物车
    public CartVo getCart(Integer userId) {
        //从Redis中获取用户的购物车
        ValueOperations<String, CartVo> ops = redisTemplate.opsForValue();
        CartVo cartvo = ops.get(RedisConst.USER_CART_PREFIX + ":" + userId);
        //如果Redis中没有，创建一个新的购物车
        if (cartvo == null) {
            cartvo = new CartVo();
            //添加用户的ID到购物车
            cartvo.setUserId(userId);
        }
        //将数据存入Redis
        ops.set(RedisConst.USER_CART_PREFIX + ":" + userId, cartvo);
        return cartvo;
    }

    @Override //添加一件商品到购物车
    public CartVo addCartItem(Integer userId, Integer goodsId) {
        //获取某个用户的购物车对象
        CartVo cartvo = getCart(userId);
        //通过bookId从数据库中获取书籍对象
        Goods goods = goodsMapper.selectById(goodsId);
        //调用方法添加到购物车中，数量是1本
        CartItemVo item = new CartItemVo(userId,
                goodsId,
                goods.getName(),
                goods.getImgSrc(),
                goods.getPrice(), 1);
        cartvo.addItem(item);
        //将购物车对象保存到Redis中7天
        redisTemplate.opsForValue().set(
                RedisConst.USER_CART_PREFIX + ":" + userId,
                cartvo,
                RedisConst.USER_CART_EXPIRE, TimeUnit.DAYS);
        return cartvo;
    }

    @Override //删除购物车一项
    public void remove(Integer userId, Integer goodsId) {
        // 获取用户的购物车对象
        CartVo cartvo = getCart(userId);
        // 从购物车中移除指定的商品
        cartvo.removeItem(goodsId);
        // 将更新后的购物车对象保存到Redis中
        redisTemplate.opsForValue().set(
                RedisConst.USER_CART_PREFIX + ":" + userId,
                cartvo,
                RedisConst.USER_CART_EXPIRE, TimeUnit.DAYS);
    }
    @Override //删除选中的购物车
    public void removeBySelection(Integer userId, List<CartItemVo> cartItemVos) {
        // 获取用户的购物车对象
        CartVo cartvo = getCart(userId);
        cartItemVos.forEach(cartItemVo->{
            // 从购物车中移除指定的商品
            cartvo.removeItem(cartItemVo.getGoodsId());
        });

        // 将更新后的购物车对象保存到Redis中
        redisTemplate.opsForValue().set(
                RedisConst.USER_CART_PREFIX + ":" + userId,
                cartvo,
                RedisConst.USER_CART_EXPIRE, TimeUnit.DAYS);
    }

    @Override //删除购物车
    public void removeAll(Integer userId) {
        // 从Redis中删除用户的购物车对象
        redisTemplate.delete(RedisConst.USER_CART_PREFIX + ":" + userId);
    }

    @Override
    public void updateQuantity(Integer userId, Integer goodsId,Integer quantity) {
        // 获取用户的购物车对象
        CartVo cartvo = getCart(userId);
        cartvo.updateItemQuantity(goodsId,quantity);
        //将购物车对象保存到Redis中7天
        redisTemplate.opsForValue().set(
                RedisConst.USER_CART_PREFIX + ":" + userId,
                cartvo,
                RedisConst.USER_CART_EXPIRE, TimeUnit.DAYS);
    }


    


}